#pragma once
#include <pthread.h>

// 小缓冲区
typedef struct
{
    char *ptr;      // 数据指针
    int total_size; // 总长度
    int len;        // 当前长度
} SubBuffer;

// 大缓冲区
typedef struct
{
    SubBuffer *sub_buffers[2]; // 两个小缓冲区
    int read_index;           // 读缓冲区索引
    int write_index;          // 写缓冲区索引
    pthread_mutex_t read_lock; // 读锁
    pthread_mutex_t swap_lock; // 交换锁
} Buffer;

/**
 * @description: 初始化缓冲区
 * @param {int} total_size 其中一份缓冲区的大小，实际双缓冲会占用total_size * 2的内存
 * @return {*} 初始化后的缓冲区
 */
Buffer *app_buffer_init(int total_size);

/**
 * @description: 写入数据
 * @param {Buffer} *buffer 缓冲区
 * @param {char} *write_data 写入的数据
 * @param {int} write_len 写入的数据长度
 * @return {*} 写入成功返回0，否则返回-1
 */
int app_buffer_write(Buffer *buffer, char *write_data, int write_len);

/**
 * @description: 读取数据
 * @param {Buffer} *buffer 缓冲区
 * @param {char} *read_buff 读取的数据,写入的目标空间，已分配空间
 * @param {int} read_buff_size 可读取的数据长度（可用空间）
 * @return {int} 实际读取的数据
 */
int app_buffer_read(Buffer *buffer, char *read_buff, int read_buff_size);

/**
 * @description: 释放缓冲区
 * @param {Buffer} *buffer 缓冲区
 */
void app_buffer_free(Buffer *buffer);
